package com.fg.pro.ai.utils;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class AiByAlibabaUtils {

    private final static List<AiMode> aiImageModeList;

    static {
        aiImageModeList = new ArrayList<>();

        // 通义千问系列
        aiImageModeList.add(new AiMode(
                "通义千问-Image",
                "qwen-image",
                "通义千问系列首个图像生成模型，参数规模200亿。具备卓越的文本渲染能力，在复杂文本渲染、各类生成与编辑任务中表现出色，在多个公开基准测试中获得SOTA。",
                "¥0.25 / 张",
                "顶级文本渲染。200亿参数，专为复杂文字生成和编辑任务优化，多项基准SOTA。",
                "生成带复杂文字的海报、Logo、广告素材"
        ));

        aiImageModeList.add(new AiMode(
                "通义千问-Image-Edit",
                "qwen-image-edit",
                "通义千问系列首个图像编辑模型，成功将Qwen-Image的文本渲染能力拓展到编辑任务上。支持精准的中英双语文字编辑、视觉外观与语义双重编辑、具备强大的跨基准性能表现。",
                "¥0.3 / 张",
                "精准图像编辑。继承强大文本渲染能力，支持图中文字、外观和语义的精准编辑。",
                "修改图片中的文字或元素，图片内容修复和优化"
        ));

        aiImageModeList.add(new AiMode(
                "通义千问-MT-Image",
                "qwen-mt-image",
                "专注做图片翻译的模型服务，能将中、英、日等11个语言的图片翻译到指定的语言，精准还原图片排版和内容信息，支持术语定义、敏感词过滤、商品主体检测等自定义功能，提供灵活、准确、高效的图像本地化服务。",
                "¥0.003 / 张",
                "专业图片翻译。支持11语种互译，精准还原排版，带术语定制、敏感词过滤功能。",
                "将图片中的外语翻译成中文，国际化内容本地化"
        ));

        // 通义万相2.2系列
        aiImageModeList.add(new AiMode(
                "通义万相2.2-文生图-Plus",
                "wan2.2-t2i-plus",
                "全新升级的通义万相2.2文生图，更丰富的画面细节。在生成图像创意性、稳定性、写实质感方面全面升级，指令遵循更强，原生支持多种风格。支持最大200万像素生成，支持智能提示词改写等。",
                "¥0.2 / 张",
                "高质版。最新一代，细节、创意、质感、指令跟随全面升级，支持200万像素。",
                "高质量创意图像生成，艺术创作，商业设计"
        ));

        aiImageModeList.add(new AiMode(
                "通义万相2.2-文生图-Flash",
                "wan2.2-t2i-flash",
                "全新升级的通义万相2.2文生图，更快的生成速度。在生成图像创意性、稳定性、写实质感方面全面升级，指令遵循更强，原生支持多种风格。支持最大200万像素生成，支持智能提示词改写等。",
                "¥0.14 / 张",
                "高速版。与Plus版能力相同，但生成速度更快，适合需要快速响应的场景。",
                "快速原型设计，批量图像生成，实时预览"
        ));

        // 通义万相2.1系列
        aiImageModeList.add(new AiMode(
                "通义万相2.1-文生图-Plus",
                "wanx2.1-t2i-plus",
                "通义万相2.1-文生图-Plus，更丰富的画面细节，在图像美观度、真实感、艺术性上全面升级，更强的语义理解能力、丰富的风格泛化性、支持最大200万像素生成，支持智能提示词改写等。",
                "¥0.2 / 张",
                "高质版。上一代成熟版本，图像美观度、真实感、艺术性出色，支持200万像素。",
                "稳定的高质量图像生成，成熟项目使用"
        ));

        aiImageModeList.add(new AiMode(
                "通义万相2.1-文生图-Turbo",
                "wanx2.1-t2i-turbo",
                "通义万相2.1-文生图-Turbo，更快的生成速度，在图像美观度、真实感、艺术性上全面升级，更强的语义理解能力、丰富的风格泛化性、支持最大200万像素生成，支持智能提示词改写等。",
                "¥0.14 / 张",
                "高速版。与2.1-Plus版能力相同，但生成速度更快。",
                "快速图像生成，对速度要求较高的场景"
        ));

        // AI试衣系列
        aiImageModeList.add(new AiMode(
                "AI试衣-Plus版",
                "aitryon-plus",
                "aitryon-plus是一款效果出众的虚拟试衣图片生成模型，可基于服饰平拍图片以及人物正面全身照，输出服饰的人物试衣效果图片。相较于aitryon模型，aitryon-plus模型在图片清晰度、服饰纹理细节和logo还原效果等方面均有提升，但生成耗时较长，适用于对时效性要求不高的场景。",
                "¥0.5 / 张",
                "高品质试衣。清晰度、服饰细节和logo还原效果更好，生成耗时较长。",
                "电商商品展示，虚拟试衣，服装设计预览"
        ));

        aiImageModeList.add(new AiMode(
                "AI试衣-基础版",
                "aitryon",
                "aitryon是一款性能出众的虚拟试衣图片生成模型，可基于服饰平拍图片以及人物正面全身照，输出服饰的人物试衣效果图片。aitryon模型可在较短时间内生成试衣图片，适用于对时效性要求较高的场景。",
                "¥0.2 / 张",
                "高效试衣。生成速度快，适用于对时效性要求高的场景。",
                "快速虚拟试衣，批量处理，实时预览"
        ));

        // FLUX系列
        aiImageModeList.add(new AiMode(
                "FLUX-schnell",
                "flux-schnell",
                "FLUX.1 [schnell] 作为目前开源最先进的少步模型，不仅超越了同类竞争者，甚至还优于诸如Midjourney v6.0和DALL·E 3 (HD)等强大的非精馏模型。该模型经过专门微调，以保留预训练阶段的全部输出多样性，相较于当前市场上的最先进模型，FLUX.1 [schnell] 显著提升了在视觉质量、指令遵从、尺寸/比例变化、字体处理及输出多样性等方面的可能，为用户带来更为丰富多样的创意图像生成体验。",
                "限时免费",
                "开源最强。少步生成模型，能力媲美Midjourney，视觉质量、指令遵循极强。",
                "免费体验顶级开源模型，创意探索，艺术创作"
        ));

        aiImageModeList.add(new AiMode(
                "FLUX-dev",
                "flux-dev",
                "FLUX.1 [dev] 是一款面向非商业应用的开源权重、精炼模型。FLUX.1 [dev] 在保持了与FLUX专业版相近的图像质量和指令遵循能力的同时，具备更高的运行效率。相较于同尺寸的标准模型，它在资源利用上更为高效。",
                "限时免费",
                "非商业高效。面向非商业应用的开源模型，保持高质量的同时运行效率更高。",
                "非商业项目，学术研究，个人学习"
        ));

        // 通义万相经典系列
        aiImageModeList.add(new AiMode(
                "通义万相-文本生成图像",
                "wanx-v1",
                "通义万相-文本生成图像大模型，支持中英文双语输入，重点风格包括但不限于水彩、油画、中国画、素描、扁平插画、二次元、3D卡通",
                "¥0.16 / 张",
                "经典多风格。支持中英文，涵盖水彩、油画、二次元、3D卡通等多种风格。",
                "多风格艺术创作，插画设计，概念图生成"
        ));

        aiImageModeList.add(new AiMode(
                "通义万相-文本生成图像-2024-05-21",
                "wanx-v1-0521",
                "通义万相-文本生成图像大模型，支持中英文双语输入，重点风格包括但不限于水彩、油画、中国画、素描、扁平插画、二次元、3D卡通，本模型为通义万相的2024年5月21号的历史快照。",
                "更新中",
                "历史版本。wanx-v1模型的历史快照，用于特定版本需求。",
                "版本一致性要求，历史项目维护"
        ));
    }





    /**
     * 获取所有AI图像模型列表
     */
    public static List<AiMode> getAiImageModeList() {
        return new ArrayList<>(aiImageModeList);
    }

    /**
     * 根据模型代码查找模型
     */
    public static AiMode getModelByCode(String modelCode) {
        return aiImageModeList.stream()
                .filter(model -> model.getModelCode().equals(modelCode))
                .findFirst()
                .orElse(null);
    }

    /**
     * 根据需求场景筛选模型
     */
    public static List<AiMode> getModelsByDemand(String demandKeyword) {
        List<AiMode> result = new ArrayList<>();
        for (AiMode model : aiImageModeList) {
            if (model.getModelDemandScenario().contains(demandKeyword) ||
                    model.getModelScene().contains(demandKeyword)) {
                result.add(model);
            }
        }
        return result;
    }

    /**
     * 获取免费模型列表
     */
    public static List<AiMode> getFreeModels() {
        List<AiMode> result = new ArrayList<>();
        for (AiMode model : aiImageModeList) {
            if ("限时免费".equals(model.getModelPrice()) ||
                    model.getModelPrice().contains("免费")) {
                result.add(model);
            }
        }
        return result;
    }




    @Data
    public static class AiMode {
        public String modelName;
        public String modelCode;
        public String modelDes;
        public String modelPrice;
        public String modelScene;
        public String modelDemandScenario;

        public AiMode(String modelName, String modelCode, String modelDes, String modelPrice, String modelScene, String modelDemandScenario) {
            this.modelName = modelName;
            this.modelCode = modelCode;
            this.modelDes = modelDes;
            this.modelPrice = modelPrice;
            this.modelScene = modelScene;
            this.modelDemandScenario = modelDemandScenario;
        }
    }
}
